■ Xportによる PC(telnet)−PIC間通信         
                           及び   PIC − PIC間通信                   

 <X Port 概要>
  (1)全般
     ネットワーク経由で簡単にハードウェアを制御できるコンポーネントとしてラントロニクス(LANTRONIX)社のネット
      ワークユニット ”X Port”(エックスポートとよむ)があります。 XPortはイーサネットコネクタ(RJ45)、シリアルポート、
      汎用I/Oポートを持ち、イーサネット信号とシリアル信号、汎用I/O信号を相互変換できる機能をもった デバイスです。
      デバイス自身が1つのURLをもつことから ”デバイス・サーバ”とも呼ばれています。 秋葉原の若松電商 などで
      7000円/個 程度で購入することができます。
    
        ---------- XPort諸元(Xport-03)----------
  
     ・内臓プロセッサ   …… DSTinEX
    ・シリアル通信速度 …… 300Kbps 〜 920Kbps
   ・電源電圧      …… 3.3V
   ・消費電流      …… 119mA(at Idle時)
                    〜240mA(通信時)
   ・シリアルデータ
       IN       …… VIL  = 0 〜 0.8 V 
                      VIH  =  2.0V 〜5.5V
                                   
              OUT             ……  VOL = max 0.4 V
                      VOH = min 2.4 V
    ・ 汎用I/O    
       IN       …… VIL  = 0 〜 0.8 V 
                                        VOH = min 2.4 V
       OUT     …… IOL  = 4mA
                     IOH  = 4mA




     【XPortに関する技術資料】
     ★鞄新システムズ
           ★LANTRONIX社


(1) XportによるPC(telnet)−PIC間通信

   
  <試作品仕様>
   ・ PCのキーボードから入力した文字を液晶の1行目に ” Input=文字 ”と表示する
   ・ PCのキーボードから入力した文字と入力した文字のアスキーコードで次の文字と入力した文字のアスキーコードで
     次の次の文字を2行目に PIC has send  の後に表示する。
     <例> 入力文字が B の場合
          1行目  Input=B
                      2行目    PIC has send BCD

   ・ PCのDOS窓に 入力した文字とPICから送信されてきた文字を表示する。
 



  <回路図>
   ・ PIC18F452をつかった場合の回路図を以下に示します。(→回路図のPDFファイル
   ・ XportとPIC間の通信は ハード的な電圧レベルを除いてRS232Cに準拠した通信です。
     ( 通信速度:9600bps データビット:8 ストップビット:1 パリティ:なし フロー制御:なし)
     ( XportのVOHはmin 2.4Vで、PICは2.0V以上がHなので レベルシフトなしで直結しました)
       ・ 下記回路はXport通信時約240mAという大電流を電源から消費します。3端子レギュレータなどで
     電源を設計する場合は冷却フィン取り付け、分圧などをおこない熱破壊のないように気をつけ
     ましょう。
   
   ★ ハブ+ルータを除いてPCとXportをクロスケーブルで直結しても動作しました。この場合PCのDHCP(Dynamic Host
          Configuration Protocol)機能はOFFとして手動でURLを設定する必要があります。
  

   



  <試作品外観>  下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

  


以下のプログラム例の中にある液晶表示器制御ライブラリ 1llcd_lib.cは 後閑哲也さんが設計されたものです
   <プログラム例>
//--------------------------------------
// 構成
// telnet(PC) → Xport(LAN) → PIC18F452→ 16文字キャラクタ液晶

#include "18f452.h"
#use delay(clock=40000000)
#FUSES  EC,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#use RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7)    // TX=RC6,RX=RC7


//////// Port define and link LCD library 
#define mode     0

//  No1 液晶
#define input_x         input_D
#define output_x        output_D
#define set_tris_x      set_tris_D
#define rs PIN_D2       //chip select
#define stb PIN_D0      //strobe

#include <1lcd_lib.c>

main(){
        char cmnd;

        set_tris_c(0b10010000);// 必須 in = RC7 & RC4

        lcd_init();
        lcd_cmd(0b00001100);                    // カーソル:OFF    ブリンク:OFF
        lcd_clear();
        printf(lcd_data,"telnet to PIC !!");
        delay_ms(1000); //


        while(1){

                printf("\r\nCommand = ");       //message
                cmnd = getc();          // PCのキーボードからの入力を待つ

                printf("  :(character from PC to PC via telnet and Xport)");
                printf("\r\nResponse = ");

                putc(cmnd);             // PC側へ受信した文字を送信する
                putc(cmnd + 0x01);      //PC側へ受信した文字の次のアスキーコード文字を送信する
                putc(cmnd + 0x02);      //PC側へ受信した文字の次の次のアスキーコード文字を送信する
                printf("  :(characters from PIC to PC via telnet and Xport)\r\n");
        
                lcd_clear();
                printf(lcd_data,"Input=%c",cmnd);       //液晶の1行目に受信した文字を表示する
                lcd_cmd(0xC0); // 2行目の先頭へ
                printf(lcd_data,"PIC has send %c%c%c",cmnd,cmnd + 0x01,cmnd + 0x02);
                                                                                                // 送信した文字を液晶の2行目に表示する
        }
        return 0;
}
//**************************************
//インクルードファイル    1lcd_lib.c
//このファイルは後閑哲也さんが設計されたものです
//**************************************

///////////////////////////////////////////////
//  液晶表示器制御ライブラリ
//  内蔵関数は以下
//    lcd_init()    ----- 初期化
//    lcd_cmd(cmd)  ----- コマンド出力
//    lcd_data(chr) ----- 1文字表示出力
//    lcd_clear()   ----- 全消去



//////// データ出力サブ関数
void lcd_out(int code, int flag)
{
        output_x((code & 0xF0) | (input_x() & 0x0F));
        if (flag == 0)
                output_high(rs);                //表示データの場合
        else
                output_low(rs);                 //コマンドデータの場合
        delay_cycles(4);                        //NOP 1         
        output_high(stb);                       //strobe out
        delay_cycles(8);                        //NOP 2
        output_low(stb);                        //reset strobe
}
//////// 1文字表示関数
void lcd_data(int asci)
{
        lcd_out(asci, 0);                       //上位4ビット出力
        lcd_out(asci<<4, 0);            //下位4ビット出力
        delay_us(50);                           //50μsec待ち
}
/////// コマンド出力関数
void lcd_cmd(int cmd)
{
        lcd_out(cmd, 1);                        //上位4ビット出力
        lcd_out(cmd<<4, 1);                     //下位4ビット出力
        delay_ms(2);                            //2msec待ち
}
/////// 全消去関数
void lcd_clear()
{
        lcd_cmd(0x01);                          //初期化コマンド出力
        delay_ms(15);                           //15msec待ち
}
/////// 初期化関数
void lcd_init()
{
        set_tris_x(mode);                       //モードセット
        delay_ms(15);
        lcd_out(0x30, 1);                       //8bit mode set
        delay_ms(5);
        lcd_out(0x30, 1);                       //8bit mode set
        delay_ms(1);
        lcd_out(0x30, 1);                       //8bit mode set
        delay_ms(1);
        lcd_out(0x20, 1);                       //4bit mode set
        delay_ms(1);
        lcd_cmd(0x2E);                          //DL=0 4bit mode
        lcd_cmd(0x08);                          //display off C=D=B=0
        lcd_cmd(0x0D);                          //display on C=D=1 B=0
        lcd_cmd(0x06);                          //entry I/D=1 S=0
        lcd_cmd(0x02);                          //cursor home
}



<動作手順>
 @ LANTRONIX社のHPから DeviceInstallerと云うソフトをダウンロードしてPCへインストールします。
  A PCとLANケーブルで上記の制御キバンをつなぎ通電した状態でDeviceInstallerを起動します。
    正常であればアイコンのSearchをクリックすると下記のようにXportのIPアドレスが表示されます。

      以下は、 IPアドレス、ポート番号を下記として設定し、通信をした場合のものです。
        
                                       IPアドレス           ポート番号:
                   PC         192.168.0.2       3001
         Xport       192.168.0.44         14001

 




    B DeviceInstallerから Xportにたいして下記の画面などで所要の設定をおこないます。
         




  C DOSのコマンドラインから XportのIPアドレス、ポート番号を指定してtelnet接続をおこないます。



   Dキーボードから文字を送ります。 下記のような表示があらわれます。

     以下は ”B” のあとに ”2” をキーインした時のものです。
  



   E また 液晶には下記のような表示があらわれます。
     以下は PCから ”B”をキーインした時のものです。





(2) Xportによる PIC−PIC間通信

  PCを介さないでXportをインターフェースとして2つのPICをハブ+ルーターにつなぎ通信をおこなった例を紹介します

<試作品の仕様>
 ★送信側PIC
   ・200msec毎に0〜255までの整数を生成し 受信側PICにXport経由で送信する
   ・生成した整数はアスキー文字でで液晶に表示する

 ★受信側PIC
   ・Xport経由で受信したデータをアスキー文字で1段目左から順次ならべて表示する。
   ・上段の行がいっぱいになったら下段に表示する。下段も文字がいっぱいなったらすべての文字を消去してまた
    上段の左から順次ならべて表示する。

<回路図>(→回路図のPDFファイル
  ・ 送信側と受信側の回路は同じです
  ・ ハブとルータを省略してクロスのLANケーブルで直接Xport同士を接続しても動作します。 クロスのLANケーブルは
    秋葉原(ラジオセンタ)のミマツ音響などで10分程度待っていれば好みの長さでつくってくれます。 




 <試作品外観>  下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




以下のプログラム例の中にある液晶表示器制御ライブラリ 1llcd_lib.cは 後閑哲也さんが設計されたものです

   <プログラム例>

//***************************
//      <送信側>
//***************************
//-------------------------------------- // 構成 // PIC18F452   →  Xport(LAN)  →  Xport(LAN) →  PIC18F452  → 16文字キャラクタ液晶 // IP_address 192.168.0.44 192.168.0.55 // Port(ch) 10001 10001 // Remote IP address 192.168.0.55 192.168.0.44 // Port(ch) 10001 10001 // ConnectMode 0xC1 0xC1 (サーバ、クライアント両機能ON) // 9600bps フロー制御なし スタートビット1 パリティなし #include "18f452.h" #use delay(clock=40000000) #FUSES EC,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) // TX=RC6,RX=RC7 //////// Port define and link LCD library #define mode 0 // No1 液晶 #define input_x input_D #define output_x output_D #define set_tris_x set_tris_D #define rs PIN_D2 //chip select #define stb PIN_D0 //strobe #include <1lcd_lib.c> main(){ int cmnd,res_cmnd; unsigned int i,j; set_tris_c(0b10010000);// 必須 in = RC7 & RC4 lcd_init(); lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); printf(lcd_data,"PIC to PIC !!"); while(1){ i =0; for(i = 0; i < 255; i++) { cmnd = i; putc(cmnd); lcd_clear(); printf(lcd_data,"SendData=%c",cmnd); //液晶の1行目に送信したアスキー文字をを表示する delay_ms(200); } } return 0; } //--------------------------------------------------------------------------- //************************************** //インクルードファイル 1lcd_lib.c //このファイルは後閑哲也さんが設計されたものです //************************************** /////////////////////////////////////////////// // 液晶表示器制御ライブラリ // 内蔵関数は以下 // lcd_init() ----- 初期化 // lcd_cmd(cmd) ----- コマンド出力 // lcd_data(chr) ----- 1文字表示出力 // lcd_clear() ----- 全消去 //////// データ出力サブ関数 void lcd_out(int code, int flag) { output_x((code & 0xF0) | (input_x() & 0x0F)); if (flag == 0) output_high(rs); //表示データの場合 else output_low(rs); //コマンドデータの場合 delay_cycles(4); //NOP 1 output_high(stb); //strobe out delay_cycles(8); //NOP 2 output_low(stb); //reset strobe } //////// 1文字表示関数 void lcd_data(int asci) { lcd_out(asci, 0); //上位4ビット出力 lcd_out(asci<<4, 0); //下位4ビット出力 delay_us(50); //50μsec待ち } /////// コマンド出力関数 void lcd_cmd(int cmd) { lcd_out(cmd, 1); //上位4ビット出力 lcd_out(cmd<<4, 1); //下位4ビット出力 delay_ms(2); //2msec待ち } /////// 全消去関数 void lcd_clear() { lcd_cmd(0x01); //初期化コマンド出力 delay_ms(15); //15msec待ち } /////// 初期化関数 void lcd_init() { set_tris_x(mode); //モードセット delay_ms(15); lcd_out(0x30, 1); //8bit mode set delay_ms(5); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x20, 1); //4bit mode set delay_ms(1); lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //display off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 lcd_cmd(0x02); //cursor home } //--------------------------------------------------------------------------------- //*********************** // <受信側> //*********************** #include <18F452.h> #use delay(clock=40000000) #FUSES EC,WDT64,PUT,BROWNOUT,BORV42,NOPROTECT,NOLVP // WDT = 18msec × 64 = 1152 msec #use RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) // TX=RC6,RX=RC7 #use fast_io(B) #use fast_io(D) //////// Port define and link LCD library #define mode 0 // No1 液晶 #define input_x input_D #define output_x output_D #define set_tris_x set_tris_D #define rs PIN_D2 //chip select #define stb PIN_D0 //strobe #include "1lcd_lib.c" char cmnd; main() { int i = 0; lcd_init(); lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); printf(lcd_data,"PIC to PIC"); lcd_cmd(0xC0); // 2行目の先頭へ printf(lcd_data,"Start !!"); while(1){ cmnd = getc();//コマンド受信 restart_wdt(); i++; if(i == 16)lcd_cmd(0xC0); // 2行目の先頭へ if(i >=32) { lcd_cmd(0x01); // 全消去 i = 0; } lcd_data(cmnd);//  文字表示 } return 0; } //--------------------------------------------------------------------------- //************************************** //インクルードファイル 1lcd_lib.c //このファイルは後閑哲也さんが設計されたものです //************************************** /////////////////////////////////////////////// // 液晶表示器制御ライブラリ // 内蔵関数は以下 // lcd_init() ----- 初期化 // lcd_cmd(cmd) ----- コマンド出力 // lcd_data(chr) ----- 1文字表示出力 // lcd_clear() ----- 全消去 //////// データ出力サブ関数 void lcd_out(int code, int flag) { output_x((code & 0xF0) | (input_x() & 0x0F)); if (flag == 0) output_high(rs); //表示データの場合 else output_low(rs); //コマンドデータの場合 delay_cycles(4); //NOP 1 output_high(stb); //strobe out delay_cycles(8); //NOP 2 output_low(stb); //reset strobe } //////// 1文字表示関数 void lcd_data(int asci) { lcd_out(asci, 0); //上位4ビット出力 lcd_out(asci<<4, 0); //下位4ビット出力 delay_us(50); //50μsec待ち } /////// コマンド出力関数 void lcd_cmd(int cmd) { lcd_out(cmd, 1); //上位4ビット出力 lcd_out(cmd<<4, 1); //下位4ビット出力 delay_ms(2); //2msec待ち } /////// 全消去関数 void lcd_clear() { lcd_cmd(0x01); //初期化コマンド出力 delay_ms(15); //15msec待ち } /////// 初期化関数 void lcd_init() { set_tris_x(mode); //モードセット delay_ms(15); lcd_out(0x30, 1); //8bit mode set delay_ms(5); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x20, 1); //4bit mode set delay_ms(1); lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //display off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 lcd_cmd(0x02); //cursor home }


<動作手順>

 @ LANTRONIX社のHPから DeviceInstallerと云うソフトをダウンロードしてPCへインストールします。
  A PCもLANケーブルでハブにつなぎます。上記の制御キバンをつなぎ通電した状態でDeviceInstallerを起動します。
    正常であればアイコンのSearchをクリックすると下記のようにXportのIPアドレスが表示されます。
   
 B 2つのXportのIPアドレスをネットワークにつながっているPCやプリンタなどのIPアドレスととバッティングしないように
   設定します。
     

    尚、本試作品では以下のIPアドレス、ポート番号で動作させています。

      送信側 Xport
           IP アドレス 192.168.0.44
                        Port番号  10001


             受信側 Xport
           IPアドレス  192.168.0.55
                        Port番号  10001

 
 C 次にポートのプロパティを以下のように設定します

  送信側 Xport 受信側 Xport

Dつづいて デバイスのコンフィギュレーションを以下のように設定します。送信側と受信側は全く同じです。



E以上の設定後、動作させると以下の表示が液晶画面にあらわれます。
  画面は” ] ”( 0x5D )が送信された直後の液晶画面です。